home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / happy03 / calendar.pas next >
Pascal/Delphi Source File  |  1994-11-16  |  6KB  |  151 lines

  1. {*********************************************************************
  2.  *    **** カレンダー (HAPPy Version 0.3添付版) ****                 *
  3.  *                                                                   *
  4.  *        HAPPyのサンプルプログラム                                  *
  5.  *          (作者  浅野比富美 Public Domain Software)                *
  6.  *********************************************************************}
  7.  
  8. (*
  9.    inputから、表示させたい年と月を入力すると、
  10.    その月の前後1ケ月ずつ、合計3ケ月にわたってカレンダーを
  11.    outputに出力します
  12. *)
  13.  
  14. program Calendar(input,output) ;
  15.  
  16. type
  17.   PrintRange = (before,now,after) ;   { before:前月 now:今月 after:来月}
  18.   YoubiType  = 0..6 ;                 { 日曜日=0  土曜日=6             }
  19.  
  20. var
  21.   Nissu      : array[1..12]      of 1..31     ;  { 月の日数を格納   }
  22.   Year       : array[PrintRange] of integer   ;  { 表示する年を格納 }
  23.   Month      : array[PrintRange] of integer   ;  { 表示する月を格納 }
  24.   FirstYoubi : array[PrintRange] of YoubiType ;  { 1日の曜日        }
  25.  
  26. (***************************************)
  27. (*    初期設定 (各月の日数を設定)      *)
  28. (*      とりあえず 2月は28日としておく *)
  29. (***************************************)
  30. procedure init ;
  31. begin
  32.   Nissu[ 1{月}] := 31{日} ; Nissu[ 2{月}] := 28{日} ; Nissu[ 3{月}] := 31{日} ;
  33.   Nissu[ 4{月}] := 30{日} ; Nissu[ 5{月}] := 31{日} ; Nissu[ 6{月}] := 30{日} ;
  34.   Nissu[ 7{月}] := 31{日} ; Nissu[ 8{月}] := 31{日} ; Nissu[ 9{月}] := 30{日} ;
  35.   Nissu[10{月}] := 31{日} ; Nissu[11{月}] := 30{日} ; Nissu[12{月}] := 31{日}
  36. end {init} ;
  37.  
  38. (***************************************)
  39. (*   y年m月d日の曜日を算出する関数     *)
  40. (*     この関数で使っている計算式の    *)
  41. (*     意味はよくわかりませんが、      *)
  42. (*     汎用関数として使えると思います  *)
  43. (***************************************)
  44. function Youbi(y{年},m{月},d{日}:integer) : YoubiType ;
  45.   var m1,y1 : integer;
  46. begin
  47.   if m >= 3 then
  48.     begin  m1 := m - 2   ; y1 := y      end
  49.   else
  50.     begin  m1 := m  + 10 ; y1 := y - 1  end ;
  51.   Youbi := (y1 + y1 div 4 - y1 div 100 + y1 div 400
  52.                + trunc(2.6*m1 - 0.19) + d    ) mod 7
  53. end {Youbi} ;
  54.  
  55. (***************************************)
  56. (* year年が閏年の時、真を返す関数       *)
  57. (*   4年に一度だが、、100年に一度閏年で *)
  58. (*   なく、400年に一度閏年になります   *)
  59. (***************************************)
  60. function Uruu(year:integer) : Boolean ;
  61. begin
  62.   Uruu := (year mod 4 = 0) and (year mod 100 <> 0) or (year mod 400 = 0)
  63. end {Uruu} ;
  64.  
  65. (***************************************)
  66. (*      カレンダーの表示処理           *)
  67. (***************************************)
  68. procedure Print ;
  69.   var Day    : array[PrintRange] of integer ;  { 表示する日 }
  70.       Finish : array[PrintRange] of Boolean ;  { 各月の表示が終わったら真 }
  71.       youbi  : YoubiType  ;
  72.       n      : PrintRange ;
  73. begin
  74.   for n := before to after do           { 初期設定 }
  75.   begin
  76.     Finish[n] := false ;
  77.     Day   [n] := 1{日}
  78.   end ;
  79.  
  80.   writeln ;                             { カレンダーの表題 }
  81.   for n := before to after do
  82.     write('****':9,Year[n]:5,'年',Month[n]:2,'月 ****') ;
  83.   writeln ;
  84.   for n := before to after do
  85.     write('日 月 火 水 木 金 土':25) ;
  86.   writeln ;
  87.  
  88.   repeat
  89.     for n := before to after do          { 前月 今月 来月の 1行分   }
  90.     begin
  91.       write(' ':4) ;                     { 次の月のカラムまで進める }
  92.       for youbi := 0{日曜} to 6{土曜} do { 各月の1週間分            }
  93.       begin
  94.         if (Day[n] = 1{日}) and (youbi < FirstYoubi[n]) or Finish[n]
  95.           then write(' ':3)
  96.         else                             { 表示していない日の時     }
  97.         begin
  98.           write(Day[n]:3) ;
  99.           Day[n] := Day[n] + 1{日} ;
  100.           Finish[n] :=  Day[n] > Nissu[Month[n]]  { その月の終わりの判定 }
  101.         end
  102.       end {for youbi}
  103.     end {for n} ;
  104.     writeln
  105.   until Finish[before] and Finish[now] and Finish[after]
  106.  
  107. end {Print} ;
  108.  
  109. (***************************************)
  110. (*            メイン処理               *)
  111. (***************************************)
  112. begin {main}
  113.   init ;                                { 初期設定 }
  114.  
  115.   repeat                                { 表示したい年を入力 }
  116.     write('何年?(西暦2年~9998年) ') ;
  117.     readln(Year[now])
  118.   until (2{年} <= Year[now]) and  (Year[now] <= 9998{年}) ;
  119.                      { 2~9998年に深い意味はありません       }
  120.  
  121.   repeat                                { 表示したい月を入力 }
  122.     write('何月?(1月~12月) ') ;
  123.     readln(Month[now])
  124.   until Month[now] in [1{月}..12{月}] ;
  125.  
  126.   if Uruu(Year[now]) then Nissu[2{月}] := 29{日} ;   { 閏年補正 }
  127.  
  128.                                         { 表示する年、月を求める }
  129.   Month[before] := Month[now]  - 1{月} ;
  130.   Month[after ] := Month[now]  + 1{月} ;
  131.   Year [before] := Year [now] ;
  132.   Year [after ] := Year [now] ;
  133.   if Month[now] = 1{月} then            { 今月が1月の時は、}
  134.   begin                                 { 前月は去年の12月 }
  135.     Month[before] := 12{月} ;
  136.     Year [before] := Year[now] - 1{年}
  137.   end
  138.   else if Month[now] = 12{月} then      { 今月が12月の時は、}
  139.   begin                                 { 来月は来年の1月   }
  140.     Month[after] := 1{月} ;
  141.     Year [after] := Year[now] + 1{年}
  142.   end ;
  143.                                         { 1日の曜日を求める }
  144.   FirstYoubi[before] := Youbi(Year[before], Month[before], 1{日}) ;
  145.   FirstYoubi[now   ] := Youbi(Year[now   ], Month[now   ], 1{日}) ;
  146.   FirstYoubi[after ] := Youbi(Year[after ], Month[after ], 1{日}) ;
  147.  
  148.   Print                                 { 表示する }
  149.  
  150. end {main}.
  151.